package com.baseframe.system.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baseframe.mybatis.utils.BaseMetaObjectUtil;
import com.baseframe.mybatis.utils.PageInfo;
import com.baseframe.system.entity.BaseDict;
import com.baseframe.system.entity.request.BaseDictRequest;
import com.baseframe.system.entity.vo.BaseDictVO;
import com.baseframe.system.service.BaseDictService;
import com.baseframe.tool.result.R;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/dict")
@AllArgsConstructor
public class BaseDictController {
    /**
     这是一个基础字典控制器类的代码示例。该类包含了新增或修改字典内容的方法和分页查询字典的方法。

     在新增或修改字典内容的方法中，通过注解@PostMapping("/save-or-update")将该方法映射为HTTP的POST请求。该方法接收一个BaseDictRequest
     类型的参数，用于接收字典内容的请求。在方法内部，首先创建一个BaseDict对象，并使用BeanUtils.copyProperties方法将接收到的请求参数复制到
     BaseDict对象中。接着调用baseDictService.saveOrUpdate方法保存或更新字典内容，并根据返回结果返回相应的响应结果。

     在分页查询字典的方法中，通过注解@GetMapping("/page")将该方法映射为HTTP的GET请求。该方法接收一个PageInfo类型的参数和一
     个BaseDictRequest类型的参数，用于接收分页和查询条件的请求。在方法内部，调用baseDictService.getDictPage方法根据分页和
     查询条件获取字典的分页数据，并将结果封装到R<Page<BaseDictVO>>对象中返回。

     请注意，上述代码中的baseDictService是一个BaseDictService类型的私有属性，由于代码截断，无法确定它是如何注入的。此外，还需要导
     入相应的类库来支持这些类和注解。
     *
     */
    private BaseDictService baseDictService;

    /**
     * 新增或修改字典内容
     * @param request
     * @return
     */
    @PostMapping("/save-or-update")
    public R<Object> saveOrUpdateDict(@RequestBody BaseDictRequest request){

        BaseDict baseDict = new BaseDict();
        BeanUtils.copyProperties(request,baseDict, BaseMetaObjectUtil.getUpdateFillPropertiesName(BaseDict.class));
        return baseDictService.saveOrUpdate(baseDict)?R.success():R.fail();
    }



    /**
     * 这是基础字典控制器类中的另外三个方法：删除字典、根据字典编号获取字典、查询所有字典集合。
     *
     * deleteDict方法：通过注解@PostMapping("/delete")将该方法映射为HTTP的POST请求。该方法接收一个
     * BaseDictRequest类型的参数，用于接收删除字典的请求。在方法内部，首先判断请求参数中的字典ID是否为空，
     * 如果为空则返回缺少必要请求参数的错误响应。否则，调用baseDictService.removeById方法根据字典ID删除
     * 字典，并根据返回结果返回相应的响应结果。
     *
     * loadDictByCode方法：通过注解@GetMapping("/load-by-code")将该方法映射为HTTP的GET请求。该方法
     * 接收一个code参数，用于接收字典编号的请求。在方法内部，首先判断请求参数中的字典编号是否为空，如果为空则返
     * 回缺少必要请求参数的错误响应。否则，调用baseDictService.loadDictByCode方法根据字典编号获取字典，
     * 并将结果封装到R<Object>对象中返回。
     *
     * loadAll方法：通过注解@GetMapping("/load-all")将该方法映射为HTTP的GET请求。该方法没有参数，直接返
     * 回baseDictService.loadAll方法获取的所有字典集合，并将结果封装到R<List<BaseDictVO>>对象中返回。
     *
     * 这些方法完成了基础字典的删除、根据字典编号获取字典以及查询所有字典集合的功能。请注意，方法中的返回类型、注
     * 解和条件判断逻辑可能会根据具体框架和业务需求进行调整。
     */
    /**
     * 分页查询字典
     * @param pageInfo
     * @param request
     * @return
     */
    @GetMapping("/page")
    public R<Page<BaseDictVO>> getDictPage(PageInfo pageInfo,BaseDictRequest request){


        return R.data(baseDictService.getDictPage(pageInfo,request));
    }

    /**
     * 删除字典
     * @param request
     * @return
     */
    @PostMapping("/delete")
    public R<Object> deleteDict(@RequestBody BaseDictRequest request){

        if (request.getId() == null){
            return R.fail("缺少必要请求参数");
        }

        return baseDictService.removeById(request.getId())?R.success():R.fail();
    }


    /**
     * 荣国字典编号获取字典
     * @param code
     * @return
     */
    @GetMapping("/load-by-code")
    public R<Object> loadDictByCode(String code){

        if (code == null){
            return R.fail("缺少必要请求参数");
        }


        return R.data(baseDictService.loadDictByCode(code));
    }


    /**
     * 查询所有字典集合
     * @return 字典集合
     */
    @GetMapping("/load-all")
    public R<List<BaseDictVO>> loadAll(){

        return R.data(baseDictService.loadAll());
    }



}
